import org.apache.poi.xwpf.usermodel.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WordTemplateFiller {
    public static void main(String[] args) {

        // 创建数据映射
        Map<String, String> data = new HashMap<>();
        data.put("year", "2024");
        data.put("month", "4");
        data.put("day", "28");
        data.put("index", "20");
        data.put("cityBasicInfo", "2024年3月，全市共有低收入人口49219户60898人，发放社会救助资金和残疾人两项补贴资金9051.825万元（社救4787.76万元、临时救助181.26元万元 ）。其中最低生活保障21895户31386人1848.32万元，特困人员供养25584人2939.44万元，困难残疾人生活补贴53207人3538.009万元，重残疾人护理补贴46583人544.796万元，临时救助3344人181.26万元，纳入低保边缘家庭管理1653户3707人，纳入支出型困难家庭管理87户221人。本月新增低收入人口95户135人，动态管理退出366户474人，新增288人申请残疾人两项补贴，停发578人。");
        data.put("businessInfo","2024年3月，全市通过智慧民政救助系统申请救助共有9271人，通过低收入人口认定审批179人，临时救助认定审批3472人，经核查不符合救助条件不予受理220人，正在核查中1678人，未受理3722人，申请受理率99.25%，按期完成率98.32%。其中申请受理率最高为海陵区、医药高新区（高港区）、姜堰区、兴化市、靖江市100%，最低为兴化市99.34%；按期完成率最高为海陵区100.00%；办理量最高的乡镇（街道）为475人，最低的为0人。本月通过系统进行预警2316条，处置1952条，其中重复救助预警1267条，处置1164条，核对报告预警0条，处置0条，死亡预警1049条，处置788条。全市2024年3月前还有未办理完成救助申请201条，最多的是泰兴市，有199条。详见附表1、附表2。");
        data.put("urbanDb","本月发放城市低保资金2129户2844人169.44万元，平均补差水平595.78元每人，3月10日前完成资金发放和核对确认的地区6个，3月10日后完成资金发放和核对确认的地区0个。本月农村低保数据手机端公示率最高为海陵区、姜堰区、兴化市，其公示率为100.00%，农村低保数据手机端公示率最低为泰兴市，其公示率为0.00%。本月动态管理新增城市低保10户12人，核减25户36人，办理中2009户3072人，按期完成率100.00%。详见附表3和附表11。");
        data.put("ruralDb","本月发放农村低保资金19766户28542人1678.88万元，平均补差水平588.21元每人，3月10日前完成资金发放和核对确认的地区6个，3月10日后完成资金发放和核对确认的地区0个。本月农村低保数据手机端公示率最高为海陵区、姜堰区、兴化市，其公示率为100.00%，农村低保数据手机端公示率最低为泰兴市，其公示率为0.00%。本月动态管理新增农村低保41户64人，核减134户200人，办理中17770户30345人，按期完成率100.00%。详见附表4和附表11。");
        data.put("disability","2024年3月，残疾人两项补贴信息系统向乡镇（街道）用户推送了682条需要提供主动服务的信息，各市（区）已发送提醒短信的184条，未发送提醒短信的0条，不符合补贴条件的402条，已享受补贴的91条，无手机号码的5条，全市主动服务率为100%。截至3月20日，在系统完成发放的地区8个，全市系统发放率达100%。全市残疾证到证未停发人数共7人，其中海陵区3人，姜堰区3人，靖江市1人；残疾证注销未停发31人（海陵区2人、泰兴市17人、兴化市5人、靖江市6人、姜堰区1人）；三、四级残疾人享受护理补贴7人，其中兴化市5人、海陵区1人、高港区1人。详见附表5。");
        data.put("destitute","本月发放特困人员供养资金25584人2939.44万元，3月10日前完成资金发放和核对确认的地区6个，3月10日后完成资金发放和核对确认的地区0个。本月特困人员数据手机端公示率最高为海陵区、姜堰区、兴化市，其公示率为100.00%，特困人员数据手机端公示率最低为泰兴市，其公示率为0.00%。本月动态管理新增特困供养人员41人，核减185人，办理中24436人，按期完成率99.97%。详见附表6和附表11。");
        data.put("temp","本月发放临时救助资金3345人181.54万元，办理中215人，按期完成率98.59%。详见附表7。");
        data.put("other","本月在册单人保家庭2419户5201人，本月动态管理新增11户29人，核减30户62人，办理中5859户5859人，按期完成率100.00%，3月10日前完成核对确认的地区6个，3月10日后完成核对确认的地区0个。低保边缘家庭1653户3707人，本月动态管理新增6户17人，核减25户52人，3月10日前完成核对确认的地区6个，3月10日后完成核对确认的地区0个。支出型困难家庭87户221人，本月动态管理新增2户6人，核减2户6人，办理中79户262人，按期完成率100.00%，3月10日前完成核对确认的地区6个，3月10日后完成核对确认的地区0个。详见附表8、附表9、附表10。");


        List<TableVO> tables=new ArrayList<>();
        TableVO table1=new TableVO();
        List<String[]> table1List=new ArrayList<>();
        String[] row1 = new String[]{"0", "1", "2","3", "4", "5","6", "7", "8","9", "10", "11","12", "13", "14","15", "16", "17","18", "19", "20","21"};
        String[] row2 = new String[]{"02", "03", "40","50", "40", "50","06", "70", "08","07", "02", "09","011", "220", "033","440", "550", "066","088", "990", "010","202"};
        String[] row3 = new String[]{"02", "03", "40","50", "40", "50","06", "70", "08","07", "02", "09","011", "220", "033","440", "550", "066","088", "990", "010","202"};
        String[] row4 = new String[]{"02", "03", "40","50", "40", "50","06", "70", "08","07", "02", "09","011", "220", "033","440", "550", "066","088", "990", "010","202"};
        String[] row5 = new String[]{"02", "03", "40","50", "40", "50","06", "70", "08","07", "02", "09","011", "220", "033","440", "550", "066","088", "990", "010","202"};
        String[] row6 = new String[]{"02", "03", "40","50", "40", "50","06", "70", "08","07", "02", "09","011", "220", "033","440", "550", "066","088", "990", "010","202"};
        String[] row7 = new String[]{"02", "03", "40","50", "40", "50","06", "70", "08","07", "02", "09","011", "220", "033","440", "550", "066","088", "990", "010","202"};
        table1List.add(row1);
        table1List.add(row2);
        table1List.add(row3);
        table1List.add(row4);
        table1List.add(row5);
        table1List.add(row6);
        table1List.add(row7);
        table1.setDataList(table1List);
        table1.setDataIndex(3);
        tables.add(table1);

        //构建月报
        buildMonthWord(data,tables,"template.docx","output.docx");
    }

    /**
     * 构建月度word
     * @param data      数据
     * @param tables    表格数据
     */
    public static void buildMonthWord(Map<String, String> data,List<TableVO> tables,String templatePath,String outputPath){
        try (FileInputStream fis = new FileInputStream(templatePath)) {
            XWPFDocument document = new XWPFDocument(fis);
            // 替换段落中的占位符
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                for (XWPFRun run : paragraph.getRuns()) {
                    String text = run.getText(0);
                    if (text != null) {
                        for (Map.Entry<String, String> entry : data.entrySet()) {
                            text = text.replace("{{" + entry.getKey() + "}}", entry.getValue());
                        }
                        run.setText(text, 0);
                    }
                }
            }

//            //所有表格
//            List<XWPFTable> xwpfTables=document.getTables();
//            for(int i=0;i<tables.size();i++){
//                int n=0;//数据行从第0条开始
//                //所有行
//                List<XWPFTableRow> rows=xwpfTables.get(i).getRows();
//
//                Integer rowIndes=tables.get(i).getDataIndex();//从第几行开始
//                for(int j=rowIndes;j<rows.size();j++){
//                    //获取一行的所有单元格
//                    List<XWPFTableCell> cells=rows.get(j).getTableCells();
//                    String[] dataCells=tables.get(i).getDataList().get(n);
//                    for(int k=0;k<cells.size();k++){
//                        XWPFTableCell cell=cells.get(k);
//                        setCellText(cell,dataCells[k], 9, "宋体", ParagraphAlignment.CENTER);
//                    }
//                    n++;
//                }
//            }

            // 保存生成的文档
            try (FileOutputStream fos = new FileOutputStream(outputPath)) {
                document.write(fos);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 设置单元格内容的方法
    public static void setCellText(XWPFTableCell cell, String text, int fontSize, String fontFamily, ParagraphAlignment alignment) {
        // 清空单元格内容
        cell.removeParagraph(0);
        // 设置新的段落和文本
        XWPFParagraph paragraph = cell.addParagraph();
        XWPFRun run = paragraph.createRun();
        run.setText(text);
        // 设置字体大小
        run.setFontSize(fontSize);
        // 设置字体
        run.setFontFamily(fontFamily);
        // 设置段落对齐方式
        paragraph.setAlignment(alignment);
    }
}
